package iterator

// ConstIterator 定义了一个常量元素集合的迭代器，元素不能被修改。
type ConstIterator[T any] interface {
	// IsValid 检查当前迭代器是否有效，即它是否已到达集合的末尾。
	IsValid() bool

	// GetValue 返回当前迭代器指向的元素的值。
	GetValue() T

	// Next 将迭代器移动到下一个元素，并返回更新后的迭代器。
	Next() ConstIterator[T]

	// Equal 比较当前迭代器与另一个迭代器，如果它们指向同一个元素，返回 true。
	Equal(other ConstIterator[T]) bool
}

// Iterator 是 ConstIterator 的扩展，允许修改迭代器指向的元素的值。
type Iterator[T any] interface {
	ConstIterator[T] // 嵌入 ConstIterator，继承它的所有方法。

	// SetValue 设置当前迭代器指向的元素的值。
	SetValue(value T)
}

// ConstKVIterator 定义了一个用于键值对的迭代器，其中元素是常量，不能被修改。
type ConstKVIterator[K, V any] interface {
	ConstIterator[V] // 继承自 ConstIterator，但每个元素是一个键值对（值的类型是 V）。

	// Key 返回当前键值对的键。
	Key() K
}

// KVIterator 扩展了 ConstKVIterator，允许修改键值对中的值。
type KVIterator[K, V any] interface {
	ConstKVIterator[K, V] // 继承自 ConstKVIterator，允许访问键和值。

	// SetValue 设置当前键值对中元素的值。
	SetValue(value V)
}

// ConstBidIterator 是一个常量双向迭代器，可以在集合中向前和向后移动。
type ConstBidIterator[T any] interface {
	ConstIterator[T] // 继承自 ConstIterator。

	// Prev 将迭代器移动到前一个元素，并返回更新后的迭代器。
	Prev() ConstBidIterator[T]
}

// BidIterator 扩展了 ConstBidIterator，允许修改迭代器指向的元素的值。
type BidIterator[T any] interface {
	ConstBidIterator[T] // 继承自 ConstBidIterator，支持双向移动。

	// SetValue 设置当前迭代器指向的元素的值。
	SetValue(value T)
}

// ConstKvBidIterator 结合了键值对迭代和双向迭代，元素是常量，不能被修改。
type ConstKvBidIterator[K, V any] interface {
	ConstKVIterator[K, V] // 继承自 ConstKVIterator，允许访问键值对。
	BidIterator[V]        // 继承自 BidIterator，支持双向移动值。
}

// KVBidIterator 扩展了 ConstKvBidIterator，允许在双向迭代中修改键值对。
type KVBidIterator[K, V any] interface {
	KVIterator[K, V] // 继承自 KVIterator，允许访问键值对并修改值。
	BidIterator[V]   // 继承自 BidIterator，支持双向移动值。
}

// RandomAccessIterator 是一个支持按位置随机访问元素的迭代器，并支持双向移动。
type RandomAccessIterator[T any] interface {
	BidIterator[T] // 继承自 BidIterator，支持双向移动。

	// At 将迭代器移动到指定位置，并返回更新后的迭代器。
	At(position int) RandomAccessIterator[T]

	// Position 返回当前迭代器在集合中的位置。
	Position() int
}
